#include "apue.h"
#include "pr_mask.c"
#include <signal.h>

static void 
sig_usr2(int signo)
{
    pr_mask("in SIGUSR2 handler: ");
}

typedef void (Sigfunc)(int);
Sigfunc *signal(int signum, Sigfunc *handler);

Sigfunc * 
signal(int signo, Sigfunc *func)
{
    struct sigaction    act, oact;

    act.sa_handler = func;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    if (signo == SIGALRM) {
#ifdef  SA_INTERRUPT
        act.sa_flags |= SA_INTERRUPT;
#endif
    } else {
        act.sa_flags |= SA_RESTART;
    }
    if (sigaction(signo, &act, &oact) < 0)
        return(SIG_ERR);
    return(oact.sa_handler);
}

int 
main(void)
{
    sigset_t sigset;

    pr_mask("before add SIGUSR1: ");

    sigemptyset(&sigset);
    sigaddset(&sigset, SIGUSR1);
    sigprocmask(SIG_BLOCK, &sigset, NULL);

    pr_mask("after add SIGUSR1: ");

    signal(SIGUSR2, sig_usr2);
    raise(SIGUSR2);
    pr_mask("out SIGUSR2 handler: ");
}
